package gsw.demo.mvp.demo.dagger;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import javax.inject.Inject;
import javax.inject.Named;

import gsw.demo.mvp.R;
import gsw.demo.mvp.demo.dagger.bean.UserA;
import gsw.demo.mvp.demo.dagger.component.DaggerUserAComponent;

/**
 * Dagger使用示例
 * 首先，下载依赖：
 * implementation 'com.google.dagger:dagger:2.4'
 * annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
 * 然后，新建Module类，用来提供new对象
 * 然后，新建Component接口，用来注册对象。一旦创建Component，就必须给注册对象提供@Provides方法。
 * 然后，build项目，使用生成的Dagger开头的Component来注册对象，即可。
 * <p>
 * Dagger的优点：解耦。当Activity销毁时，自动清空生成的对象及其引用。
 * Dagger的原理：
 *  注入对象：通过apt，在注册对象时，给对象的属性赋值。
 */
public class ActivityDagger extends Activity {

    @Inject
    @Named("user1")
    UserA user1;

    @Inject
    @Named("user2")
    UserA user2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dagger);
        /**
         * 注册对象有两种方法。
         * 方法一：直接create()。使用默认的构造函数，实例化Module。
         */
        DaggerUserAComponent.create().inject(this);
        /**
         * 方法二：使用build()。使用自定义的构造函数，实例化Module。
         */
        //DaggerUserAComponent.builder().userAModule(new UserAModule()).build().inject(this);
    }

    public void show1(View view) {
        Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show();
    }
}










